<template>
    <div class="app-container">
      <el-form :model="queryParams" ref="queryForm" size="mini" :inline="true" v-show="showSearch" label-width="100px">
        <el-form-item label="任务名称" prop="nodeName">
          <el-input
            v-model="queryParams.nodeName"
            placeholder="请输入任务名称"
            clearable
            @keyup.enter.native="handleQuery"
          />
        </el-form-item>
        <el-form-item label="流程状态" prop="flowStatus">
          <el-select v-model="queryParams.nodeType" placeholder="请选择流程状态" clearable>
            <el-option
              v-for="dict in dict.type.flow_status"
              :key="dict.value"
              :label="dict.label"
              :value="dict.value"
            />
          </el-select>
        </el-form-item>
        <el-form-item label="抄送人" prop="flowName">
          <el-input
            v-model="queryParams.flowName"
            placeholder="请输入任抄送人"
            @keyup.enter.native="handleQuery"
          />
        </el-form-item>
        <el-form-item>
          <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
          <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
        </el-form-item>
      </el-form>
      <el-table v-loading="loading" :data="instanceList" @selection-change="handleSelectionChange">
        <el-table-column type="selection" width="55" align="center" fixed />
        <el-table-column label="序号" width="55" align="center" key="id" prop="id">
          <template slot-scope="scope">
            {{ scope.$index + 1 }}
          </template>
        </el-table-column>
        <el-table-column label="流程实例id" width="100" align="center" prop="id" :show-overflow-tooltip="true"/>
        <el-table-column label="流程名称" align="center" prop="flowName" :show-overflow-tooltip="true"/>
        <el-table-column label="任务名称" align="center" prop="nodeName" :show-overflow-tooltip="true"/>
        <el-table-column label="抄送人" align="center" prop="approver" :show-overflow-tooltip="true"/>
        <el-table-column label="流程状态" align="center" prop="flowStatus" :show-overflow-tooltip="true">
          <template slot-scope="scope">
            <dict-tag :options="dict.type.flow_status" :value="scope.row.flowStatus"/>
          </template>
        </el-table-column>
        <el-table-column label="创建时间" align="center" prop="createTime" width="160" :show-overflow-tooltip="true">
          <template slot-scope="scope">
            <span>{{ parseTime(scope.row.createTime) }}</span>
          </template>
        </el-table-column>
        <el-table-column label="操作" align="center" width="240" fixed="right" class-name="small-padding fixed-width">
          <template slot-scope="scope">
            <el-button
              size="mini"
              type="text"
              @click="toFlowImage(scope.row.id)"
            >流程图</el-button>
          </template>
        </el-table-column>
      </el-table>

      <pagination
        v-show="total>0"
        :total="total"
        :page.sync="queryParams.current"
        :limit.sync="queryParams.size"
        @pagination="getList"
      />

      <component v-bind:is="approve" v-model="businessId" :taskId="taskId" @refresh="getList"></component>
      <el-dialog title="流程图" :visible.sync="flowChart" width="80%">
        <img :src="imgUrl" width="100%" style="margin:0 auto"/>
      </el-dialog>

      <!-- 权限标识：选择用户 -->
      <el-dialog :title="`${dialogTitle}用户选择`" v-if="userVisible" :visible.sync="userVisible" width="80%" append-to-body>
        <selectUser :postParams="postParams" :type="dialogTitle" :selectUser.sync="form.assigneePermission" :userVisible.sync="userVisible" @handleUserSelect="handleUserSelect"></selectUser>
      </el-dialog>
    </div>
  </template>

  <script>
  import * as api from "@/api/flow/execute";
  import { flowImage } from "@/api/flow/definition";
  import selectUser from "@/components/SelectUser";

  export default {
    name: "Todo",
    dicts: ['flow_status'],
    components: {
      selectUser
    },
    data() {
      return {
        // 遮罩层
        loading: true,
        imgUrl: "",
        flowChart: false,
        // 选中数组
        ids: [],
        // 非单个禁用
        single: true,
        // 非多个禁用
        multiple: true,
        // 显示搜索条件
        showSearch: true,
        // 总条数
        total: 0,
        // 流程实例表格数据
        instanceList: [],
        // 业务审批页面
        approve: null,
        taskId: "",
        businessId: "",
        // 查询参数
        queryParams: {
          current: 1,
          size: 10,
          nodeName: null,
          flowStatus: null,
          approver: null,
          flowName: null,
          createTime: null,
        },
        // 表单参数
        form: {},
        // 表单校验
        rules: {
          assigneePermission: [
            { required: true, message: "请选择", trigger: "change" }
          ],
        },
        dialogTitle: "",
        postParams: {},
        userVisible: false
      };
    },
    created() {
      this.getList();
    },
    methods: {
      /** 查询流程实例列表 */
      getList() {
        this.loading = true;
        api.copyPage(this.queryParams).then(response => {
          this.instanceList = response.data;
          this.total = response.total;
          this.loading = false;
        });
      },
      /** 搜索按钮操作 */
      handleQuery() {
        this.queryParams.current = 1;
        this.getList();
      },
      /** 重置按钮操作 */
      resetQuery() {
        this.resetForm("queryForm");
        this.handleQuery();
      },
      // 多选框选中数据
      handleSelectionChange(selection) {
        this.ids = selection.map(item => item.id)
        this.single = selection.length!==1
        this.multiple = !selection.length
      },
      /** 办理按钮操作 */
      handle(row) {
        this.taskId = row.id
        this.businessId = row.businessId
        if (row.formCustom == 'N' && row.formPath) {
          // 实际情况是，不同条件对应不同的页面，所以用动态组件
          this.approve = (resolve) => require([`@/views/${row.formPath}`], resolve)
        }
      },
      toFlowImage(instanceId) {
        flowImage(instanceId).then(response => {
          this.flowChart = true
          this.imgUrl = "data:image/gif;base64," + response.data;
        });
      },
      /** 转办|加签|委派|减签弹框显示按钮操作 */
      transferShow(row, title) {
        this.form.assigneePermission = null;
        this.taskId = row.id;
        this.dialogTitle = title;
        api.getTaskById(this.taskId).then(res => {
          this.form.assigneePermission = res.data.assigneePermission ? res.data.assigneePermission.split(",") : [];
        });
        this.userVisible = true;
        let operatorTypeObj = {
          "转办": "1",
          "加签": "6",
          "委派": "3",
          "减签": "7"
        };
        this.postParams = {
          url: "interactiveTypeSysUser",
          taskId: row.id,
          operatorType: operatorTypeObj[title]
        };
      },
      // 获取选中用户数据
      handleUserSelect(checkedItemList) {
        this.form.assigneePermission = checkedItemList.map(e => {
          return e.userId;
        });
        let assigneePermission = JSON.parse(JSON.stringify(this.form.assigneePermission));
        let operatorTypeObj = {
          "转办": "2",
          "加签": "6",
          "委派": "3",
          "减签": "7"
        };
        api.interactiveType(this.taskId, Array.isArray(assigneePermission) ? assigneePermission.join(',') : assigneePermission,  operatorTypeObj[this.dialogTitle])
        .then(() => {
          this.$modal.msgSuccess(`${this.dialogTitle}成功`);
          this.getList();
        });
      }
    }
  };
  </script>
